﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Box.Entities;
using Microsoft.Practices.ObjectBuilder2;

namespace Box.Repository
{
    public class ProductoRepository : MasterRepository, IProductoRepository
    {
        public List<Producto> GetAllFromProducto()
        {
            var query = from c in Context.Productos.Include("TipoProducto")
                        
                        where c.Estado !=false
                        orderby c.Stock ascending
                        orderby c.NombreProducto descending 
                        select c;
            return query.ToList();
        }

        public List<Producto> GetFromProductoByCriterio(string criterio)
        {
            var query = from c in Context.Productos
                        .Include("TipoProducto")
                        orderby c.DescripcionProducto + c.NombreProducto ascending
                        where c.Estado != false
                        select c;
            if (criterio != null && criterio != string.Empty)
            {
                query = from c in query
                        where c.NombreProducto.ToUpper().Contains(criterio.ToUpper()) ||
                              c.DescripcionProducto.ToUpper().Contains(criterio.ToUpper())||
                              c.TipoProducto.DescripcionProducto.ToUpper().Contains(criterio.ToUpper())&&
                              c.Estado !=false

                        select c;
            }
            return query.ToList();
        }

        public Producto GetFromProductoById(int id)
        {
            var query = from p in Context.Productos
                        .Include("DetalleCatalogoProductos.Insumo")
                select p;
            if (id!=null)
            {
                query = from p in query
                    where p.Id.Equals(id)
                    select p;
            }
            return query.SingleOrDefault();
        }

        public void AddProducto(Producto producto)
        {
            //var newProducto = new Producto();

            //newProducto.NombreProducto = producto.NombreProducto;
            //newProducto.Precio = producto.Precio;
            ////newProducto.IdCategoria = producto.Categoria.Id;
            ////newProducto.IdTipoProduto = producto.TipoProducto.Id;

            //foreach (var item in producto.DetalleCatalogoProductos)
            //{
            //    var detalle = new DetalleCatalogoProductos();
            //    detalle.Cantidad = item.Cantidad;
            //    detalle.IdInsumo = item.IdInsumo;

            //    detalle.PrecioUnit = item.PrecioUnit;

            //    newProducto.DetalleCatalogoProductos.Add(detalle);
            //}

            producto.DetalleCatalogoProductos
                .ForEach(i => Context.Entry(i.Insumo).State = EntityState.Unchanged);
            Context.Productos.Add(producto);
            Context.SaveChanges();
        }

        public void UpdateProducto(Producto producto)
        {
            var productoDB = GetFromProductoById(producto.Id);

            productoDB.Precio = producto.Precio;
            productoDB.IdTipoProduto = producto.IdTipoProduto;

            if (productoDB.NombreProducto != producto.NombreProducto)
            {
                productoDB.NombreProducto = producto.NombreProducto;
            }
            var DetalleEliminados = new List<DetalleCatalogoProductos>();

            foreach (var detalleBD in productoDB.DetalleCatalogoProductos)
            {
                var eliminado = producto.DetalleCatalogoProductos
                    .Where(dp => dp.Item == detalleBD.Item)
                    .SingleOrDefault();

                if (eliminado==null)
                {
                    DetalleEliminados.Add(detalleBD);
                }
            }

            foreach (var detEliminado in DetalleEliminados)
            {
                var eliminar = productoDB.DetalleCatalogoProductos
                    .Where(p => p.Item == detEliminado.Item)
                    .SingleOrDefault();
                producto.DetalleCatalogoProductos.Remove(eliminar);
            }

            foreach (var detalle in producto.DetalleCatalogoProductos)
            {
                if (detalle.Item==0)
                {
                    Context.Entry(detalle.Insumo).State = EntityState.Unchanged;
                    productoDB.DetalleCatalogoProductos.Add(detalle);
                }
                else
                {
                    var detalleDB =
                        productoDB.DetalleCatalogoProductos
                        .Where(dp => dp.Item == detalle.Item).SingleOrDefault();

                    detalleDB.Cantidad = detalle.Cantidad;
                    detalle.PrecioUnit = detalle.PrecioUnit;

                    Context.Entry(detalleDB.Insumo).State = EntityState.Unchanged;
                    Context.Entry(detalleDB).State = EntityState.Modified;
                }
            }
            Context.Entry(productoDB).State = EntityState.Modified;
            Context.SaveChanges();
        }

        public void RemoveProducto(int id)
        {
            var existe = Context.Productos.Find(id);
            if (existe != null)
            {
                Context.Entry(existe).State= EntityState.Modified;
                existe.Estado = false;
                Context.SaveChanges();
            }
        }

        public bool ExisteProductoStockBajo()
        {
            var query = Context.Productos.Where(p => p.Stock<=3);

            return query.Any();
        }


        public int ProductoBajoStock()
        {
            var query = from p in Context.Productos
                where p.Stock <= 3
                select p;

            return query.Count();
        }
    }
}
